package Bank;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;

public class DB {
	
	public List<ContaCorrente> listaContasBanco = new ArrayList<ContaCorrente>();
	public List<Cliente> listaClientesBanco = new ArrayList<Cliente>();
	public List<Funcionario> listaFuncionariosBanco = new ArrayList<Funcionario>();
	public List<Agencia> listaAgenciasBanco = new ArrayList<Agencia>();	
	private Funcionario admin;
	private Cliente user;
	private Cliente user2;	
	private ContaCorrente userConta;
	private ContaCorrente userConta2;	
	private Agencia agenciaMatriz;
	private Agencia filial1;
	private Agencia filial2;
	private Agencia filial3;
	private Agencia filial4;
	private Agencia filial5;
	
	public DB(){	
		load();
	}
	
	// Carrega dados do DB para serem utilizados pela aplicação através da classe
	private void load(){
		// Cria agências
		agenciaMatriz = new Agencia(0, "Matriz");
		listaAgenciasBanco.add(agenciaMatriz);
		
		filial1 = new Agencia(1, "Agencia Filial 1");
		listaAgenciasBanco.add(filial1);
		
		filial2 = new Agencia(2, "Agencia Filial 2");
		listaAgenciasBanco.add(filial2);
		
		filial3 = new Agencia(3, "Agencia Filial 3");
		listaAgenciasBanco.add(filial3);
		
		filial4 = new Agencia(4, "Agencia Filial 4");
		listaAgenciasBanco.add(filial4);
		
		filial5 = new Agencia(5, "Agencia Filial 5");
		listaAgenciasBanco.add(filial5);
		
		// Cria usuários
		admin = new Funcionario("Administrador", "admin", "12345", agenciaMatriz);
		user = new Cliente("Usuario", "user", "12345");
		user2 = new Cliente("Usuario2", "user2", "12345");		
		listaFuncionariosBanco.add(admin);
		listaClientesBanco.add(user);
		listaClientesBanco.add(user2);		
		
		// Cria contas
		userConta = new ContaCorrente(0, agenciaMatriz, 1000.0);
		userConta2 = new ContaCorrente(1, agenciaMatriz, 800.0);		
		listaContasBanco.add(userConta);
		listaContasBanco.add(userConta2);
		
		// Adiciona contas para os usuários
		user.setConta(userConta);
		user2.setConta(userConta);		
		
		// Cria saques nas contas
		Saque saque1 = null;
		try {
			saque1 = new Saque(new SimpleDateFormat("yyyyMMdd - hh:mm:ss").parse("20110520 - 11:20:10"), agenciaMatriz, userConta, 1000.00);
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		Saque saque2 = null;
		try {
			saque2 = new Saque(new SimpleDateFormat("yyyyMMdd - hh:mm:ss").parse("20130520 - 11:20:10"), agenciaMatriz, userConta, 900.00);
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		Saque saque3 = null;
		try {
			saque3 = new Saque(new SimpleDateFormat("yyyyMMdd - hh:mm:ss").parse("20120520 - 11:20:10"), agenciaMatriz, userConta, 900.00);
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		user.getConta().addSaque(saque1);
		user.getConta().addSaque(saque2);		
		user.getConta().addSaque(saque3);		
	}
	
	// Adiciona Cliente à lista de clientes do sistema
	public void addClienteToList(Cliente cliente){
		this.listaClientesBanco.add(cliente);
	}	
	
	// Busca ContaCorrente pelo número da Agencia e número da ContaCorrente
	public ContaCorrente getContaByRef(int agencia, int conta){
		for (int i=0; i<this.listaContasBanco.size(); i++) {
			if (this.listaContasBanco.get(i).getAgencia().getNumero() == agencia){
				if (this.listaContasBanco.get(i).getNumeroConta() == conta){
					return this.listaContasBanco.get(i);
				}
			}
		}
		
		return null;
	}
	
	public boolean existeAgencia(int numeroAgencia) {
		for (int i = 0; i < listaAgenciasBanco.size() ; i++) {
			if(listaAgenciasBanco.get(i).getNumero() == numeroAgencia) {
				return true;
			}
		}		
		return false;
	}
	
	public Agencia buscaAgencia (int numeroAgencia) {
		for (int i = 0; i < listaAgenciasBanco.size() ; i++) {
			if(listaAgenciasBanco.get(i).getNumero() == numeroAgencia) {
				return listaAgenciasBanco.get(i);
			}
		}
		return null;
	}
	
	public boolean existeContaCorrente(int numeroContaCorrente) {
		for (int i = 0; i < listaContasBanco.size() ; i++) {
			if(listaContasBanco.get(i).getNumeroConta() == numeroContaCorrente) {
				return true;
			}
		}		
		return false;
	}
	
	public ContaCorrente buscaContaCorrente (int numeroContaCorrente) {
		for (int i = 0; i < listaContasBanco.size() ; i++) {
			if(listaContasBanco.get(i).getNumeroConta() == numeroContaCorrente) {
				return listaContasBanco.get(i);
			}
		}
		return null;
	}

	public List<ContaCorrente> getListaContasBanco() {
		return listaContasBanco;
	}

	public void setListaContasBanco(List<ContaCorrente> listaContasBanco) {
		this.listaContasBanco = listaContasBanco;
	}

	public List<Cliente> getListaClientesBanco() {
		return listaClientesBanco;
	}

	public void setListaClientesBanco(List<Cliente> listaClientesBanco) {
		this.listaClientesBanco = listaClientesBanco;
	}

	public List<Agencia> getListaAgenciasBanco() {
		return listaAgenciasBanco;
	}

	public void setListaAgenciasBanco(List<Agencia> listaAgenciasBanco) {
		this.listaAgenciasBanco = listaAgenciasBanco;
	}
}
